To use this patch, run these commands for a successful build:

    patch -p1 <patches/adaptec_acl_mods.diff
    ./prepare-source
    ./configure --enable-acl-support
    make

Philip Lowman wrote:
> Attached is a small patch which allows the preservation of the delete,
> chmod, and chown bits which Adaptec has added to XFS on their SnapOS NAS
> units.  This is nice for backing up files between different NAS units
> and preserving all of the Samba ACLs.
>
> I'm not sure how useful this patch will be because I'm not sure if any
> other NAS vendors have standardized on their extensions to POSIX ACLs to
> support Samba in the same manner that Adaptec has.  FWIW, though, this
> will allow you to preserve acls when copying between different Adaptec
> based NAS units running SnapOS.

I (Wayne) tweaked the patch to work with the latest source.

Todo:

Fix a bug that could lose some bits when stripping some (supposedly)
superfluous ACL info.

based-on: 1ddcdaf3f6808ba53aef9e19f630a18808de22ac
diff --git a/lib/sysacls.c b/lib/sysacls.c
--- a/lib/sysacls.c
+++ b/lib/sysacls.c
@@ -31,6 +31,18 @@
 #endif
 #define DEBUG(x,y)
 
+/* These are custom ACL bits used by Adaptec's modifications
+ * to XFS on their SnapOS units. */
+#ifndef ACL_DELETE
+#define ACL_DELETE 8
+#endif
+#ifndef ACL_CHMOD
+#define ACL_CHMOD 16
+#endif
+#ifndef ACL_CHOWN
+#define ACL_CHOWN 32
+#endif
+
 void SAFE_FREE(void *mem)
 {
 	if (mem)
@@ -100,6 +112,9 @@ int sys_acl_get_info(SMB_ACL_ENTRY_T entry, SMB_ACL_TAG_T *tag_type_p, uint32 *b
 		return -1;
 
 	*bits_p = (acl_get_perm(permset, ACL_READ) ? 4 : 0)
+		| (acl_get_perm(permset, ACL_CHOWN) ? 32 : 0)
+		| (acl_get_perm(permset, ACL_CHMOD) ? 16 : 0)
+		| (acl_get_perm(permset, ACL_DELETE) ? 8 : 0)
 		| (acl_get_perm(permset, ACL_WRITE) ? 2 : 0)
 		| (acl_get_perm(permset, ACL_EXECUTE) ? 1 : 0);
 
@@ -144,6 +159,12 @@ int sys_acl_set_access_bits(SMB_ACL_ENTRY_T entry, uint32 bits)
 	if ((rc = acl_get_permset(entry, &permset)) != 0)
 		return rc;
 	acl_clear_perms(permset);
+	if (bits & 32)
+		acl_add_perm(permset, ACL_CHOWN);
+	if (bits & 16)
+		acl_add_perm(permset, ACL_CHMOD);
+	if (bits & 8)
+		acl_add_perm(permset, ACL_DELETE);
 	if (bits & 4)
 		acl_add_perm(permset, ACL_READ);
 	if (bits & 2)
diff --git a/lib/sysacls.h b/lib/sysacls.h
--- a/lib/sysacls.h
+++ b/lib/sysacls.h
@@ -59,8 +59,8 @@
 #define SMB_ACL_TYPE_ACCESS	ACL_TYPE_ACCESS
 #define SMB_ACL_TYPE_DEFAULT	ACL_TYPE_DEFAULT
 
-#define SMB_ACL_VALID_NAME_BITS	(4 | 2 | 1)
-#define SMB_ACL_VALID_OBJ_BITS	(4 | 2 | 1)
+#define SMB_ACL_VALID_NAME_BITS	(32 | 16 | 8 | 4 | 2 | 1)
+#define SMB_ACL_VALID_OBJ_BITS	(32 | 16 | 8 | 4 | 2 | 1)
 
 #define SMB_ACL_NEED_SORT
 
